package com.zeng.sim.support.headStrategy;

import cn.hutool.core.util.StrUtil;
import com.zeng.sim.util.SimConstant;
import org.springframework.stereotype.Component;

import java.io.UnsupportedEncodingException;

/**
 * 给报文头追加8位长度，不足8位的左补0
 *
 * @author zengwanlin
 * @date 2023-12-25T15:12
 */
@Component
public class Len8HeadStrategy implements IHeadStrategy {

    private final Integer headLen = 8;

    /**
     * 是否支持（客户端调用）
     * @param headStrategy 当前消息头策略
     * @return
     */
    @Override
    public boolean support(SimConstant.HeadStrategy headStrategy) {
        return SimConstant.HeadStrategy.HEAD_STRATEGY_01.equals(headStrategy);
    }

    /**
     * 是否支持（服务端调用）
     * @param msgContent 报文内容
     * @return
     */
    @Override
    public boolean support(String msgContent) {
        if (msgContent.length() <= headLen) {
            // 报文长度不足8位
            return false;
        }
        String lenStr = msgContent.substring(0, headLen);
        if (!StrUtil.isNumeric(lenStr)) {
            // 前8位存在非数字
            return false;
        }
        char char9 = msgContent.charAt(headLen);
        if (Character.isDigit(char9)) {
            // 第9位是数字
            return false;
        }
        return true;
    }

    /**
     * 格式化请求报文
     * <p>
     * 追加报文头
     * @param msgContent
     * @param charsetName
     * @return
     */
    @Override
    public String appendHead(String msgContent, String charsetName) {
        try {
            return String.format("%08d", msgContent.getBytes(charsetName).length) + msgContent;
        }
        catch (UnsupportedEncodingException e) {
            throw new IllegalArgumentException("编码[" + charsetName + "]不支持", e);
        }
    }

    /**
     * 解析请求报文
     * <p>
     * 删除报文头
     * @param msgContent
     * @return
     */
    @Override
    public String deleteHead(String msgContent) {
        return msgContent.substring(8);
    }

}
